import random

def createCoreData():
    """
    产生计算节点的相关数据，
    将数据写入到core_data.txt文件中
    返回值
    avgSpeed: 计算节点的平均处理速度
    avgPrice: 计算节点的平均价格
    """
    fp = open("core_data.txt",'w')
    #将核可能的个数放在coreLst中，将内存可能的大小放在memLst中
    coreLst = [2,4,8,16]
    memLst  = [4,8,16,32]

    #使用两个数组进行每个计算节点速度和费用的记录
    speedLst = []
    priceLst = []

    for i in range(100):
        index1  = random.randint(1,4)
        index2  = random.randint(1,4)
        coreNum = coreLst[index1-1]
        memory  = memLst[index2-1]
        speed   = random.randint(100,200)
        price   = round(random.uniform(0.35,1), 2)
        str     = "{} {} {} {}\n".format(coreNum, memory, speed,price)
        fp.write(str)
        speedLst.append(speed)
        priceLst.append(price)

    fp.close()
    print("100条计算节点数据写入文件完毕！\n")
    avgSpeed = round(sum(speedLst)/100,2)
    avgPrice = round(sum(priceLst)/100,2)
    print("平均处理速度为：{}\n".format(avgSpeed))
    print("平均价格为：{}\n".format(avgPrice))
    return (avgSpeed, avgPrice)
    
def createTaskData(num, avgSpeed, avgPrice):
    """
    用于产生任务相关的数据
    输入参数：
    num:   需要产生的任务的数量
    avgSpeed: 计算节点的平均处理速度
    avgPrice: 计算节点的平均价格
    """
    filename = "task_data{}.txt".format(num)   #数据写入文件的名称
    fp = open(filename,'w')   #使用覆盖写的方式进行文件的写入
    for i in range(num):
        t    = random.randint(0,100)  #到达时间，数据范围 0-100
        K    = random.randint(1,7)    #该任务包含子任务的个数 1-7
        mem  = random.randint(1,4)    #该任务执行所需要的的内存的大小
        L    = [random.randint(10,50)*10000 for i in range(K)]   #子任务长度列表 10万到50万 MI
        b    = round(sum(L)/avgSpeed/60/60*avgPrice*1.2,2)  #预算限制  sum(L)/avgSpeed 结果为秒 秒需要转化为时 乘以单价
        d    = int(max(L)/avgSpeed*1.5) #时间限制 avgSpeed 单位 MIPS 每秒百万条
        str1 = ''
        for s in L:
            str1 += str(s)+' '
        resStr  = "{} {} {} ".format(t,K,mem)
        resStr += str1
        str2 = "{} {}\n".format(b,d)
        resStr  += str2
        fp.write(resStr)
    fp.close()
    print("{}条任务数据写入文件完毕！\n".format(num))

if __name__ == '__main__':
    #生成计算节点数据写入文件,返回平均处理速度，以及平均价格
    avgSpeed, avgPrice = createCoreData()
    #分别生成20条,100条，150条，200条的任务信息随机数据
    createTaskData(20, avgSpeed, avgPrice)
    createTaskData(100, avgSpeed, avgPrice)
    createTaskData(150, avgSpeed, avgPrice)
    createTaskData(200, avgSpeed, avgPrice)
    print("计算节点、用户任务随机信息创建完毕！")